package cn.xeblog.plugin.enums;

import cn.xeblog.plugin.action.ConsoleAction;
import cn.xeblog.plugin.factory.CommandHandlerFactory;
import cn.xeblog.plugin.util.CommandHistoryUtils;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 命令类型枚举
 *
 * @author anlingyi
 * @date 2020/8/19
 */
@Getter
@AllArgsConstructor
public enum Command {
    /**
     * 登录
     */
    LOGIN("login") {
        @Override
        public String getDesc() {
            return "登录，" + this.getCommand() + " {昵称} [-s {鱼塘编号} -h {服务端IP} -p {服务端端口} -c (清理缓存)]";
        }
    },
    /**
     * 鱼塘列表
     */
    SHOW_SERVER("showServer") {
        @Override
        public String getDesc() {
            return "鱼塘列表，" + this.getCommand() + " [-c（清理缓存)]";
        }
    },
    /**
     * 查看可用状态值
     */
    SHOW_STATUS("showStatus", "查看可用状态值"),
    /**
     * 设置当前状态
     */
    SET_STATUS("setStatus") {
        @Override
        public String getDesc() {
            return "设置当前状态，" + this.getCommand() + " {状态值}";
        }
    },
    /**
     * 游戏列表
     */
    SHOW_GAME("showGame", "游戏列表"),
    /**
     * 游戏功能
     */
    PLAY("play") {
        @Override
        public String getDesc() {
            return "游戏功能，" + this.getCommand() + " {游戏编号}";
        }
    },
    /**
     * 加入游戏
     */
    JOIN("join", "加入游戏 | 拒绝邀请：此命令后加任意字符"),
    /**
     * 打开工具
     */
    OPEN("open") {
        @Override
        public String getDesc() {
            return "打开工具，" + this.getCommand() + " [{工具编号}]";
        }
    },
    /**
     * 结束游戏
     */
    OVER("over", "结束游戏 | 工具"),
    /**
     * 查看模式选项
     */
    SHOW_MODE("showMode", "查看模式选项"),
    /**
     * 模式设置
     */
    MODE("mode") {
        @Override
        public String getDesc() {
            return "模式设置，" + this.getCommand() + " {模式编号}";
        }
    },
    /**
     * 天气查询
     */
    WEATHER("weather") {
        @Override
        public String getDesc() {
            return "天气查询，" + this.getCommand() + " {地名，如：北京市} [-d {0：当前，默认 | 3：未来3天 | 7：未来7天}]";
        }
    },
    /**
     * 消息通知
     */
    NOTIFY("notify", "消息通知，1.正常通知 | 2.隐晦通知 | 3.关闭通知"),
    /**
     * 存活的状态
     */
    ALIVE("alive", "活着，0.关闭｜1.开启"),
    /**
     * 摸鱼办生成
     */
    MO_YU("moyu", "摸鱼办生成"), ADMIN("admin", "管控"),
    /**
     * 退出
     */
    LOGOUT("exit", "退出"),
    /**
     * 清屏
     */
    CLEAN("clean", "清屏"),
    /**
     * 帮助
     */
    HELP("help", "帮助");

    private String command;
    private String desc;

  /**
   * 构造
   *
   * @param command 命令
   */
  Command(String command) {
    this.command = command;
  }

  /**
   * 触发命令的前缀
   */
  public static final String COMMAND_PREFIX = "#";

  /**
   * 命令处理
   *
   * @param command 命令
   */
  public static void handle(String command) {
    // 获取命令及参数
    String[] strs = command.split(" ");
    if (strs.length > 0) {
      for (Command cmd : values()) {
        // 位置0一定是命令，除非它是消息
        if (cmd.getCommand().equals(strs[0])) {
          String[] args = null;
          // 组装参数
          if (strs.length > 1) {
            args = new String[strs.length - 1];
            System.arraycopy(strs, 1, args, 0, args.length);
          }

          // 添加历史命令
          CommandHistoryUtils.addCommand(command);

          // 执行当前命令
          cmd.exec(args);
          return;
        }
      }
    }

    // 显示错误消息
    ConsoleAction.showErrorMsg();
  }

  /**
   * 执行命令
   */
  public void exec() {
    exec(new String[0]);
  }

  /**
   * 执行命令
   *
   * @param args 命令参数
   */
  public void exec(String... args) {
    if (args == null) {
      args = new String[0];
    }

    // 命令实例处理命令
    CommandHandlerFactory.INSTANCE.produce(this).handle(args);
  }

  /**
   * 获取命令字符串
   *
   * @return 命令字符串
   */
  public String getCommand() {
    return COMMAND_PREFIX + command;
  }

}
